﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Tencent.OA.ACM.App
{
    /// <summary>
    /// 定义一组公共的通用的扩展方法。
    /// </summary>
    public static class StringExtensions
    {
        /// <summary>
        /// 获取一个值，该值指示该字符串是否是Guid格式。
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool IsGuid(this string args)
        {
            /**
             *
             * Guid由a-f、0-9的字符组成，格式有四种：
             * {0:N} 连续32 位：
             *  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
             * {0:D} 由连字符分隔的 32 位数字：
             *  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
             * {0:B} 括在大括号中、由连字符分隔的 32 位数字：
             *  {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
             * {0:P} 括在圆括号中、由连字符分隔的 32 位数字：
             *  (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 
             * 
             */

            if (string.IsNullOrEmpty(args))
                return false;

            var options = RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase;
            return (Regex.IsMatch(args, @"^[A-Fa-f0-9]{32}$", options) || // N
                Regex.IsMatch(args, @"^[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$", options) || // D
                Regex.IsMatch(args, @"^\{[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}\}$", options) || // B
                Regex.IsMatch(args, @"^\([a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}\)$", options) // P
                );
        }

        /// <summary>
        /// 尝试从指定的字符串表示形式转换为等效的 Guid 结构。
        /// </summary>
        /// <param name="args">要转换为 GUID 的字符串。</param>
        /// <param name="value">将包含已分析的值的结构。</param>
        /// <returns>如果分析操作成功，则为 true；否则为 false。</returns>
        /// <remarks>
        /// 如果 args 为 null 或格式无法识别，此方法返回 false，不返回异常。
        /// </remarks>
        public static bool TryParseToGuid(this string args, out Guid value)
        {
            if (IsGuid(args))
            {
                value = new Guid(args);
                return true;
            }
            value = default(Guid);
            return false;
        }

    }
}
